package com.cencat.order.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.order.entity.Order;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 订单服务接口
 * 
 * @author cencat
 * @version 1.0
 * @since 2024-12-19
 */
public interface OrderService extends IService<Order> {

    /**
     * 分页查询订单列表
     * 
     * @param page 分页参数
     * @param orderStatus 订单状态
     * @param orderType 订单类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单分页数据
     */
    IPage<Order> getOrderPage(Page<Order> page, Integer orderStatus, Integer orderType, 
                             LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据订单号查询订单详情
     * 
     * @param orderNo 订单号
     * @return 订单详情
     */
    Order getOrderByOrderNo(String orderNo);

    /**
     * 根据用户ID查询订单列表
     * 
     * @param userId 用户ID
     * @param orderStatus 订单状态
     * @param page 分页参数
     * @return 用户订单列表
     */
    IPage<Order> getOrdersByUserId(Long userId, Integer orderStatus, Page<Order> page);

    /**
     * 根据司机ID查询订单列表
     * 
     * @param driverId 司机ID
     * @param orderStatus 订单状态
     * @param page 分页参数
     * @return 司机订单列表
     */
    IPage<Order> getOrdersByDriverId(Long driverId, Integer orderStatus, Page<Order> page);

    /**
     * 创建订单
     * 
     * @param order 订单信息
     * @return 创建结果
     */
    boolean createOrder(Order order);

    /**
     * 更新订单状态
     * 
     * @param orderId 订单ID
     * @param orderStatus 订单状态
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateOrderStatus(Long orderId, Integer orderStatus, LocalDateTime updateTime);

    /**
     * 分配司机
     * 
     * @param orderId 订单ID
     * @param driverId 司机ID
     * @param updateTime 更新时间
     * @return 分配结果
     */
    boolean assignDriver(Long orderId, Long driverId, LocalDateTime updateTime);

    /**
     * 更新订单价格
     * 
     * @param orderId 订单ID
     * @param totalAmount 总金额
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateOrderAmount(Long orderId, java.math.BigDecimal totalAmount, LocalDateTime updateTime);

    /**
     * 取消订单
     * 
     * @param orderId 订单ID
     * @param cancelReason 取消原因
     * @param updateTime 更新时间
     * @return 取消结果
     */
    boolean cancelOrder(Long orderId, String cancelReason, LocalDateTime updateTime);

    /**
     * 完成订单
     * 
     * @param orderId 订单ID
     * @param actualAmount 实际金额
     * @param completedTime 完成时间
     * @return 完成结果
     */
    boolean completeOrder(Long orderId, java.math.BigDecimal actualAmount, LocalDateTime completedTime);

    /**
     * 统计订单数量
     * 
     * @param orderStatus 订单状态
     * @param orderType 订单类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单数量
     */
    Long countOrders(Integer orderStatus, Integer orderType, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询订单统计数据
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计数据
     */
    List<Map<String, Object>> getOrderStatistics(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询用户订单统计
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 用户订单统计
     */
    Map<String, Object> getUserOrderStats(Long userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询司机订单统计
     * 
     * @param driverId 司机ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 司机订单统计
     */
    Map<String, Object> getDriverOrderStats(Long driverId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询订单收入统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 收入统计
     */
    Map<String, Object> getOrderIncomeStats(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询热门路线订单统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return 热门路线统计
     */
    List<Map<String, Object>> getPopularRouteStats(LocalDateTime startTime, LocalDateTime endTime, Integer limit);

    /**
     * 查询订单评价统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 评价统计
     */
    Map<String, Object> getOrderRatingStats(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 批量更新订单状态
     * 
     * @param orderIds 订单ID列表
     * @param orderStatus 订单状态
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean batchUpdateOrderStatus(List<Long> orderIds, Integer orderStatus, LocalDateTime updateTime);

    /**
     * 查询超时订单
     * 
     * @param timeoutMinutes 超时分钟数
     * @return 超时订单列表
     */
    List<Order> getTimeoutOrders(Integer timeoutMinutes);

    /**
     * 查询待分配司机的订单
     * 
     * @param limit 限制数量
     * @return 待分配订单列表
     */
    List<Order> getPendingAssignOrders(Integer limit);

    /**
     * 查询进行中的订单
     * 
     * @param driverId 司机ID（可选）
     * @return 进行中订单列表
     */
    List<Order> getActiveOrders(Long driverId);

    /**
     * 智能订单推荐
     * 
     * @param driverId 司机ID
     * @param latitude 司机当前纬度
     * @param longitude 司机当前经度
     * @param limit 推荐数量
     * @return 推荐订单列表
     */
    List<Map<String, Object>> getSmartOrderRecommendation(Long driverId, java.math.BigDecimal latitude, 
                                                          java.math.BigDecimal longitude, Integer limit);

    /**
     * 查询订单轨迹
     * 
     * @param orderId 订单ID
     * @return 订单轨迹数据
     */
    List<Map<String, Object>> getOrderTrajectory(Long orderId);

    /**
     * 更新订单位置信息
     * 
     * @param orderId 订单ID
     * @param currentLatitude 当前纬度
     * @param currentLongitude 当前经度
     * @param updateTime 更新时间
     * @return 更新结果
     */
    boolean updateOrderLocation(Long orderId, java.math.BigDecimal currentLatitude, 
                               java.math.BigDecimal currentLongitude, LocalDateTime updateTime);

}